package server

import (
	"log"
	"time"

	"google.golang.org/grpc"
)

// Config gRPC 服务配置
type Config struct {
	ListenAddr      string        // 监听地址（如 ":50051"）
	TLSEnabled      bool          // 是否启用 TLS
	TLSCertPath     string        // TLS 证书路径
	TLSKeyPath      string        // TLS 私钥路径
	MaxRecvMsgSize  int           // 最大接收消息大小（默认 1MB）
	MaxSendMsgSize  int           // 最大发送消息大小（默认 1MB）
	Log             *log.Logger   // 日志实例（支持自定义）
	ShutdownTimeout time.Duration // 优雅关闭超时（默认 5s）
}

// DefaultConfig 默认配置
func DefaultConfig() Config {
	return Config{
		ListenAddr:      "0.0.0.0:9001",
		TLSEnabled:      false, // 生产环境默认启用 TLS
		TLSCertPath:     "",
		TLSKeyPath:      "",
		MaxRecvMsgSize:  1024 * 1024, // 1MB
		MaxSendMsgSize:  1024 * 1024,
		Log:             log.Default(),
		ShutdownTimeout: 5 * time.Second,
	}
}

// GetGRPCServerOpts 转换为 gRPC 服务选项
func (c Config) GetGRPCServerOpts() []grpc.ServerOption {
	opts := []grpc.ServerOption{
		grpc.MaxRecvMsgSize(c.MaxRecvMsgSize),
		grpc.MaxSendMsgSize(c.MaxSendMsgSize),
	}
	// 若启用 TLS，添加 TLS 凭证
	if c.TLSEnabled {
		creds, err := loadTLSCreds(c.TLSCertPath, c.TLSKeyPath)
		if err != nil {
			c.Log.Fatalf("加载 TLS 凭证失败: %v", err)
		}
		opts = append(opts, grpc.Creds(creds))
	}
	return opts
}
